# # name "robot" # # .data x: .word 0:4 # x-coordinates of 4 robots y: .word 0:4 # y-coordinates of 4 robots str1: .asciiz "Your coordinates: 25 25\n" str2: .asciiz "Enter move (1 for +x, -1 for -x, 2 for + y, -2 for -y):" str3: .asciiz "Your coordinates: " sp: .asciiz " " endl: .asciiz "\n" str4: .asciiz "Robot at " str5: .asciiz "AAAARRRRGHHHHH... Game over\n" #i $s0 #myX $s1 #myY $s2 #move $s3 #status $s4 #temp,pointers $s5,$s6 .text # .globl inc # .globl getNew main: li $s1,25 # myX = 25 li $s2,25 # myY = 25 li $s4,1 # status = 1 la $s5,x la $s6,y sw $0,($s5) # x[0] = 0; y[0] = 0; sw $0,($s6) sw $0,4($s5) # x[1] = 0; y[1] = 50; li $s7,50 sw $s7,4($s6) sw $s7,8($s5) # x[2] = 50; y[2] = 0; sw $0,8($s6) sw $s7,12($s5) # x[3] = 50; y[3] = 50; sw $s7,12($s6) la $a0,str1 # cout << "Your coordinates: 25 25\n"; li $v0,4 syscall bne $s4,1,main_exitw # while (status == 1) { main_while: la $a0,str2 # cout << "Enter move (1 for +x, li $v0,4 # -1 for -x, 2 for + y, -2 for -y):"; syscall li $v0,5 # cin >> move; syscall move $s3,$v0 bne $s3,1,main_else1# if (move == 1) add $s1,$s1,1 # myX++; b main_exitif main_else1: bne $s3,-1,main_else2 # else if (move == -1) add $s1,$s1,-1 # myX--; b main_exitif main_else2: bne $s3,2,main_else3 # else if (move == 2) add $s2,$s2,1 # myY++; b main_exitif main_else3: bne $s3,-2,main_exitif # else if (move == -2) add $s2,$s2,-1 # myY--; main_exitif: la $a0,x # status = moveRobots(&x[0],&y[0],myX,myY); la $a1,y move $a2,$s1 move $a3,$s2 jal moveRobots move $s4,$v0 la $a0,str3 # cout << "Your coordinates: " << myX li $v0,4 # << " " << myY << endl; syscall move $a0,$s1 li $v0,1 syscall la $a0,sp li $v0,4 syscall move $a0,$s2 li $v0,1 syscall la $a0,endl li $v0,4 syscall la $s5,x la $s6,y li $s0,0 # for (i=0;i<4;i++) main_for: la $a0,str4 # cout << "Robot at " << x[i] << " " li $v0,4 # << y[i] << endl; syscall lw $a0,($s5) li $v0,1 syscall la $a0,sp li $v0,4 syscall lw $a0,($s6) li $v0,1 syscall la $a0,endl li $v0,4 syscall add $s5,$s5,4 add $s6,$s6,4 add $s0,$s0,1 blt $s0,4,main_for beq $s4,1,main_while # } main_exitw: la $a0,str5 # cout << "AAAARRRRGHHHHH... Game over\n"; li $v0,4 syscall li $v0,10 #} syscall # int moveRobots(int *arg0, int *arg1, int arg2, int arg3) # # arg0 $a0 base address of array of x-coordinates # arg1 $a1 base address of array of y-coordinates # arg2 $a2 x-coordinate of human (copy in $s2) # arg3 $a3 y-coordinate of human (copy in $s3) # ptrX $s0 # ptrY $s1 # i $s4 # alive $s5 # temp $s6 # # moveRobots() calls getNew() to obtain the new coordinates # of each robot. The position of each robot is updated. moveRobots: # alive = 1; # ptrX = arg0; # ptrY = arg1; li $s4,0 # for (i=0;i<4;i++) { loop: # *ptrX = getNew(*ptrX,arg2); # *ptrY = getNew(*ptrY,arg3); # if ((*ptrX == arg2) && (*ptrY == arg3)) { # alive = 0; # break; # } inc: add $s0,$s0,4 # ptrX++; # ptrY++; # } endfor: move $v0,$s5 # return alive; #} # int getNew(int arg0, int arg1) # # arg0 $a0 one coordinate of robot # arg1 $a1 one coordinate of human # temp $t0 # result $v0 # # Returns new coordinate of robot. If the absolute difference between # the robot coordinate and human coordinate is >=10, the robot # coordinate moves 10 units closer to the human coordinate. # If the absolute difference is < 10, the robot coordinate # moves 1 unit closer to the human coordinate. getNew: #{ sub $t0,$a0,$a1 # temp = arg0 - arg1; blt $t0,10,gelse1 # if (temp >= 10) sub $v0,$a0,10 # result = arg0 - 10; j exitgelse gelse1: blez $t0,gelse2 # else if (temp > 0) sub $v0,$a0,1 # result = arg0 - 1; j exitgelse gelse2: bnez $t0,gelse3 # else if (temp == 0) move $v0,$a0 # result = arg0; j exitgelse gelse3: ble $t0,-10,gelse4 # else if (temp > -10) add $v0,$a0,1 # result = arg0 + 1; j exitgelse gelse4: bgt $t0,-10,exitgelse # else if (temp <= -10) add $v0,$a0,10 # result = arg0 + 10; exitgelse: jr $31 #}